#include <stdio.h>
#include <string.h>

//405. 数字转换为十六进制数
//给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，我们通常使用 补码运算 方法。
// 注意:
// 十六进制中所有字母(a-f)都必须是小写。
// 十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以单个字符'0'来表示；
//对于其他情况，十六进制字符串中的第一个字符将不会是0字符。 
// 给定的数确保在32位有符号整数范围内。
// 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
void reverse(char* ret, int l, int r) {
    while (l <= r) {
        char tmp = ret[l];
        ret[l] = ret[r];
        ret[r] = tmp;
        l++;
        r--;
    }
}

char* toHex(int num) {
    char arr[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    char* ret = (char*)malloc(sizeof(char) * 9);
    memset(ret, '\0', sizeof(char) * 9);
    int index = 0;
    
    unsigned int n = (unsigned int)num;  // 将负数转换为补码表示

    while (n) {
        int t = n % 16;
        ret[index++] = arr[t];
        n /= 16;
    }

    if (index == 0) {
        ret[0] = '0';
    }
    else {
        reverse(ret, 0, index - 1);
    }

    return ret;
}